热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

体量|更多_初识protobuf

篇首语:本文由编程笔记#小编为大家整理,主要介绍了初识protobuf相关的知识,希望对你有一定的参考价值。 protobuf在go语言中的应用 1、什么是protobuf? pro

篇首语:本文由编程笔记#小编为大家整理,主要介绍了初识protobuf相关的知识,希望对你有一定的参考价值。



protobuf在go语言中的应用

1、什么是protobuf?



protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。


Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。


你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。 ——https://developers.google.com/protocol-buffers/


简而言之,protobuf是一种序列化结构数据的方法,类似于XML、JSON,是一种数据传输格式,它的存储方式是二进制,所以有体量更小,解析速度更快的特点。

proto不能像JSON和XML一样开箱即用,需要利用工具(protoc)来编译成常用语言的所能够使用的文件(如果.java,.go等)。

protobuf更像是一个API合同,能够供服务端(Server)和客户端(Client)同时“阅读”的一种API约定、协议。其实它就是协议的一个缓冲文件,缓冲更好地凸显了它的名字中的buf(即buffers)


2、为什么要使用protobuf?


  1. 易读且容易理解
  2. 不同语言可以互相操作,因为可以利用工具生成不同语言的代码文件
  3. 体积小(存储方式是二进制)
  4. 更快的传输效率(存储方式是二进制)
  5. 相较于JSON和XML有更高效的序列化能力
  6. 非常安全(客户端和服务端之间强类型的API合同)

3、支持序列化

序列化的定义:序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。序列化使其他代码可以查看或修改,那些不序列化便无法访问的对象实例数据。

可以把proto文件理解为上述所描述的存储区,可以从proto文件中反序列化出对象的状态,并且创建该对象。

proto相较于普通的序列化强大的一点是,它可以由开发人员按照一定的规范编写文件,并且可以利用protoc反序列化成其他任意语言能够解释的对象。



如果有接触过Java的序列化就能更好理解,Java的序列化会将此时的Java对象的状态序列化到文件当中,但是该文件是不可读的,然后可以利用Java的反序列化将当时的Java对象的状态重建。



4、proto2和proto3

protobuf有两个大版本,proto2和proto3,目前比较新的都是使用proto3,proto3相较于proto2增加了更多语言的支持。


5、protobuf包含什么?


  • 业务的描述(service)
  • 有效负载消息实体(message)

6、第一次使用protobuf


1、创建新的项目

其中包含两个目录

.
├── go.mod
├── pb #proto编译后的文件
├── proto #proto原始文件

2、创建test.proto文件

确保IDE已经安装了proto相关的插件。

在proto目录下创建

syntax = "proto3";
option go_package = ".;pb";
message SearchRequest
string query = 1;
int32 page_number = 2;
int32 result_per_page = 3;

3、利用protoc来编译

确保go是1.1版本以上并且能够正常使用go mod

安装能够将proto文件编译成go能够使用的文件的插件protoc-gen-go

go install google.golang.org/protobuf/cmd/protoc-gen-go@latest

执行protoc编译命令

protoc --proto_path=proto proto/*.proto --go_out=pb

可以看到pb目录下已经有了经protoc编译后的文件

.
├── go.mod
├── pb
│ └── test.pb.go
├── proto
│ └── test.proto

4、使用.go文件中的go对象

**OK!**现在已经完成了一次proto文件的编写、以及编译,接下来就可以直接使用.go文件中的go语言能够使用的对象了。

接下来更需要关心的是proto文件的具体编写。


7、编写proto文件

syntax = "proto3";指定该proto文件的语法是proto3(必须)

option go_package = ".;pb";指定该proto输出到当前目录下的pb文件夹

message xxx
// 字段规则:required -> 字段只能也必须出现 1 次
// 字段规则:optional -> 字段可出现 0 次或1次
// 字段规则:repeated -> 字段可出现任意多次(包括 0)
// 类型:int32、int64、sint32、sint64、string、32-bit ....
// 字段编号:0 ~ 536870911(除去 19000 到 19999 之间的数字)
字段规则 类型 名称 = 字段编号;

定义消息实体


8、总结


  1. XML、JSON、Protobuf都具有数据传输的能力
  2. XML、JSON注重数据结构化,Protobuf注重数据序列化
  3. Protobuf使用场景更明确,XML、JSON使用场景更丰富且多元(更普遍)。

推荐阅读
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • vue使用
    关键词: ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
author-avatar
手机用户2702932894
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有